/*
*创建时间：2020-03.30 16:23
*分类目录：
    一、全局注册事件 app.js
        1、微信登陆事件封装
        2、微信request事件封装(post请求)
        3、小程序内部url跳转事件封装
        4、获取设备状态栏高度、适配刘海屏，当隐藏小程序navigationBar时使用
    二、页面注册事件 page.js
        1、下拉刷新事件
        2、触底加载事件
        3、通用输入框数据绑定输入方法封装
        4、微信上传图片相关事件封装
        5、微信支付API封装
        6、微信拨打电话
        7、微信授权（微信基本用户信息）
        8、微信分享
        9、用户位置相关
        10、微信扫码
        11、页面跳转二次封装用于绑定事件对象(节省重复代码量)
        12、微信富文本解析
        13、Canvas绘制小程序码
*/

/* ————————————————————全局注册事件———————————————————— */
export default {
    //仅为了不报错才导出的O(∩_∩)O~
    //const server_url="" 服务地址,app.js顶部声明
    appGlobalData() {
        //app.js全局data
        return {
            url: {
                login: server_url + "/api/public/login/xcx"
            }
        };
    },
    // 1、微信登陆事件封装
    userLogin() {
        let that = this,
            loginUrl = that.globalData.url.login, //登陆接口
            share_code = that.globalData.openGetShareCode, //onlaunch中获得的他人的分享码
            scene = that.globalData.scenario; //进入微信小程序的入口场景值
        //定义promise方法
        return new Promise((resolve, reject) => {
            wx.login({
                success: res => {
                    if (res.code) {
                        wx.request({
                            url: loginUrl,
                            data: {
                                code: res.code, //微信登陆凭证
                                share_code: share_code,
                                scene: scene
                            },
                            header: {
                                "content-type": "application/json"
                            },
                            success: res => {
                                if (res.errno == "88888") {
                                    that.go("warn", "reLaunch");
                                } else {
                                    that.globalData.openid = res.data.data;
                                    wx.setStorageSync(
                                        "sessionid",
                                        res.data.data
                                    );
                                    //promise机制放回成功数据
                                    resolve(res.data);
                                }
                            },
                            fail: res => {
                                reject("res");
                            },
                            complete: () => {} //complete接口执行后的回调函数，无论成功失败都会调用
                        });
                    } else {
                        reject("error");
                    }
                }
            });
        });
    },
    // 2、微信request事件封装
    /**
     * @param {str} url         接口地址
     * @param {obj} params      参数对象
     * @param {function} ok     请求成功回调函数
     * @param {function} err    请求失败回调函数
     */
    post(url, params, ok, err) {
        let that = this,
            sessionid = wx.getStorageSync("sessionid"), //header配置
            apiUrl = url, //接口地址 请求成功后打印
            postUrl = server_url + url;
        if (!params) {
            params = {};
        }
        if (!params.share_code) {
            //默认参数带邀请码
            let share_code = wx.getStorageSync("share_code");
            if (share_code) {
                if (share_code != that.globalData.userInfo.share_code) {
                    params.share_code = share_code;
                }
            }
        }
        let options = {
            url: postUrl,
            data: params,
            header: {
                "content-type": "application/json", // 默认值
                sessionid: sessionid
            },
            success: res => {
                console.log("——————" + apiUrl + "——————", res);
                if (res.data.errno == 10000) {
                    console.log("----------------会话过期准备重新登录");
                    that.userLogin().then(res => {
                        options.header.sessionid = wx.getStorageSync(
                            "sessionid"
                        );
                        wx.request(options);
                    });
                } else if (res.data.errno != 0) {
                    if (err) {
                        err(res);
                    }
                    wx.showToast(
                        {
                            title: res.data.errmsg,
                            icon: "none"
                        },
                        3000
                    );
                } else if (ok) {
                    ok(res);
                }
            },
            fail: res => {
                console.log("---------post请求失败res:", res);
                if (err) {
                    err(res);
                }
            }
        };
        if (!sessionid) {
            that.userLogin().then(res => {
                options.header.sessionid = wx.getStorageSync("sessionid");
                wx.request(options);
            });
        } else {
            options.header.sessionid = wx.getStorageSync("sessionid");
            wx.request(options);
        }
    },
    //3、小程序内部url跳转
    /**
     * 页面url跳转
     * @param {str} page url参数 当type为navigateBack时page为number类型参数
     * @param {str} type 跳转的方式:navigateTo, navigateBack,redirectTo,switchTab,reLaunch    注：无type时默认reLaunch
     * @param {function} success 成功后回调函数
     * @param {function} fail 失败后回调函数
     */
    go(page, type, success, fail, complete) {
        let page0 = page;
        if (String(page).indexOf("?") != -1) {
            page0 = page.split("?")[0];
        }
        let obj = {
            url: "/pages/" + page0 + "/" + page
        };
        if (!type) {
            wx.redirectTo(obj);
        } else {
            if (success) {
                obj.success = res => {
                    success(res);
                };
            }
            if (fail) {
                obj.fail = res => {
                    fail(res);
                };
            }
            if (complete) {
                obj.complete = res => {
                    complete(res);
                };
            }
            if (type == "navigateBack") {
                wx.navigateBack(Number(page));
            } else if (type == "navigateTo") {
                wx.navigateTo(obj);
            } else if (type == "redirectTo") {
                wx.redirectTo(obj);
            } else if (type == "switchTab") {
                wx.switchTab(obj);
            } else if (type == "reLaunch") {
                wx.reLaunch(obj);
            }
        }
    },
    // 4、获取设备状态栏高度、适配刘海屏，当隐藏小程序navigationBar时使用
    /**
     * 当无顶部栏、隐藏顶部栏时，statesBar为container的padding-top值（需动态添加pd-t，单位px）
     * 当有需要自定义的顶部栏，customBar为自定义顶部栏高度（需动态添加高度，单位px）
     */
    getSystemInfo() {
        wx.getSystemInfo({
            success: e => {
                this.globalData.statusBar = e.statusBarHeight; //状态栏高度
                let custom = wx.getMenuButtonBoundingClientRect(); //菜单按钮
                this.globalData.custom = custom;
                this.globalData.customBar =
                    custom.bottom + custom.top - e.statusBarHeight; //计算得到定义的顶部栏高度
            }
        });
    },

    /* ————————————————————页面注册事件———————————————————— */
    pageData() {
        //单页面data
        return {};
    },
    // 1、下拉刷新
    /**
     * page.json中需要配置 "enablePullDownRefresh": true
     */
    onPullDownRefresh() {
        //数据加载事件

        wx.stopPullDownRefresh(); //阻止下拉刷新
        //注：微信下拉回弹体验较差，手动阻止刷新
    },

    // 2、触底加载
    /**
     * page.json中需要配置 "onReachBottomDistance": x     注：触底距离，单位像素
     */
    //触底加载
    onReachBottom() {
        //数据加载事件
    },

    // 3、通用输入框数据绑定输入方法input textarea
    /**
     *
     * @param {dom} e 事件对象
     */
    inputValue(e) {
        /**
            data-param:单独使用时数据存于页面全局data,param：键名字符串
            data-index:表单第几个对象
        */
        if (e.currentTarget.dataset.param) {
            this.setData({
                [e.currentTarget.dataset.param]: e.detail.value
            });
        } else {
            let index = e.currentTarget.dataset.index;
            let val = e.detail.value;
            this.setData({
                ["formInputList[" + index + "].val"]: val
            });
        }
    },

    // 4、微信上传图片相关事件
    // 4.1、选择添加图片的方式（相册、拍照）
    chooseImageTap() {
        let that = this;
        wx.showActionSheet({
            itemList: ["从相册中选择", "拍照"],
            itemColor: "#00000",
            success(res) {
                if (!res.cancel) {
                    if (res.tapIndex == 0) {
                        that.chooseWxImage("album");
                    } else if (res.tapIndex == 1) {
                        that.chooseWxImage("camera");
                    }
                }
            }
        });
    },
    // 4.2、图片本地路径
    /**
     * @param {str} type
     */
    chooseWxImage(type) {
        let that = this;
        wx.chooseImage({
            sizeType: ["original", "compressed"],
            sourceType: [type],
            count: 1, //图片上传数量限制
            success(res) {
                for (let i = 0; i < res.tempFilePaths.length; i++) {
                    that.upImgs(
                        res.tempFilePaths[i],
                        res.tempFilePaths.length - 1,
                        i
                    ); //调用上传方法
                }
            }
        });
    },
    // 4.3、上传服务器
    /**
     *
     * @param {*} imgurl 上传图片的本地路径
     * @param {*} allNum 上传图片总数量
     * @param {*} num    第几张图片
     */
    upImgs(imgurl, allNum, num) {
        let that = this;
        let imgUploadUrl = "/user/car/upload";
        wx.uploadFile({
            url: that.data.server_url + imgUploadUrl, //图片上传服务器地址+接口
            filePath: imgurl,
            name: "Filedata",
            header: {
                sessionid: wx.getStorageSync("sessionid"), //登陆凭证
                "content-type": "multipart/form-data"
            },
            formData: null,
            success(res) {
                let data = JSON.parse(res.data);
                let _data = data.data;
                //_data为单次上传的图片的数据信息
            }
        });
    },

    // 5、微信支付API
    // 基本思路：前端向后台发送支付申请-后台返回调支付所需的参数-前端调用微信支付-支付
    // 5.1、调后台
    pay(payApiUrl, uploadData) {
        //支付   前台→后台→前台
        let that = this;
        app.post(payApiUrl, uploadData, res => {
            let datas = res.data.data; //后台→前台的支付接口需要的信息
            that.wxPay(datas); //前台→微信
        });
    },
    // 5.2、用后台返回的参数调微信支付
    wxPay(datas) {
        //微信支付     前台→微信
        let that = this;
        wx.requestPayment({
            timeStamp: datas.timeStamp,
            nonceStr: datas.nonceStr,
            package: datas.package,
            signType: datas.signType,
            paySign: datas.paySign,
            success() {
                //成功回调
            },
            fail(res) {
                if (res.errMsg == "requestPayment:fail cancel") {
                    wx.showToast({
                        title: "支付已取消",
                        icon: "none"
                    });
                } else {
                    wx.showToast({
                        title: "支付失败,请联系客服",
                        icon: "none"
                    });
                }
            }
        });
    },

    // 6、微信拨打电话
    phoneCall(phoneNumber) {
        wx.makePhoneCall({
            phoneNumber: phoneNumber
        });
    },

    // 7、微信授权（微信基本用户信息）
    // 注：需要 <button open-type="getUserInfo" bindgetuserinfo="onGotUserInfo"></button>
    onGotUserInfo(res) {
        //微信授权
        let that = this;
        if (res.detail.userInfo) {
            let newData = res.detail.userInfo; //获取到的微信用户数据
        } else {
        }
    },

    // 8、微信分享
    // 非右上角调用需要button组件
    onShareAppMessage() {
        let options = {
            title: "", //分享时显示的标题
            path: "", //分享出去的小程序页面路径，可带参
            imageUrl: "", //分享时显示图片路径，默认为当前页面截取部分
            success() {},
            fail() {}
        };
        return options;
    },

    // 9、用户位置相关
    // 9.1、地图导航
    /**
     *
     * @param {float} lng   经度
     * @param {float} lat   纬度
     * @param {int}   scale 缩放倍数，默认28
     */
    mapShow(lng, lat, scale = 28) {
        let that = this;
        wx.getLocation({
            //获取位置信息
            type: "gcj02", //返回可以用于wx.openLocation的经纬度
            success() {
                wx.openLocation({
                    //打开地图
                    latitude: lat,
                    longitude: lng,
                    scale: scale
                });
            }
        });
    },
    // 9.2、开启地图导航
    openMap() {
        let that = this;
        let goNext = false; //是否向下执行
        wx.getSetting({
            //授权检测
            success(res) {
                if (res.authSetting["scope.userLocation"] == false) {
                    //拒绝授权
                    wx.showModal({
                        title: "请求授权当前位置",
                        content: "需要获取您的地理位置，请确认授权",
                        success(res) {
                            if (res.cancel) {
                                //依旧拒绝授权
                                wx.showToast({
                                    title: "拒绝授权",
                                    icon: "none",
                                    duration: 1000
                                });
                            } else if (res.confirm) {
                                //同意授权
                                wx.openSetting({
                                    success(dataAu) {
                                        if (
                                            dataAu.authSetting[
                                                "scope.userLocation"
                                            ] == true
                                        ) {
                                            wx.showToast({
                                                title: "授权成功",
                                                icon: "success",
                                                duration: 1000,
                                                success() {
                                                    goNext = true;
                                                }
                                            });
                                            //再次授权，调用wx.getLocation的API
                                        } else {
                                            wx.showToast({
                                                title: "授权失败",
                                                icon: "none",
                                                duration: 1000
                                            });
                                        }
                                    }
                                });
                            }
                        }
                    });
                } else if (!res.authSetting["scope.userLocation"]) {
                    //还未提出授权请求
                    goNext = true;
                } else {
                    //已授权
                    goNext = true;
                }

                if (goNext) {
                    that.mapShow(0, 0); //传入当前位置信息
                }
            }
        });
    },

    // 10、微信扫码
    wxScanCode() {
        wx.scanCode({
            success: res => {
                let result = JSON.parse(res.result);
                if (result) {
                    //执行
                }
            }
        });
    },

    // 11、页面跳转二次封装用于绑定事件对象
    // 注：仅支持非navigationBar页面，navigationBar页面请使用switchTab
    goWhere(e) {
        let page = e.currentTarget.dataset.page; //跳转路径
        let params = e.currentTarget.dataset.params; //页面传参，参数对象
        params = params ? JSON.stringify(params) : "";
        app.go(page + params, "navigateTo");
    },

    // 12、微信富文本解析
    // 注：需要wxParse.js
    // 流程：A、页面顶部引入 const wxParse = require("../../wxParse/wxParse.js");
    //       B、dom结构
    /*      <import src="../../wxParse/wxParse.wxml" />
            <template is="wxParse" data="{{wxParseData:details.nodes}}" />
    */
    conversionDetail(details) {
        var that = this;
        details = details.replace(/px/g, "rpx");
        details = details.replace(
            /\u002fupload/g,
            app.globalData.img_url + "/upload"
        );
        wxParse.wxParse("details", "html", details, that, 5);
    },

    // 13、Canvas绘制小程序码
    // 注：较占内存，ios端请勿onload中就进行绘制，否则会闪退
    // dom：<canvas canvas-id='myCanvas'></canvas>
    // 13.1、绘制入口，较慢，故在此开启加载模态框
    onSaveImg() {
        let that = this;
        wx.showLoading({
            title: "加载中...",
            success() {
                that.drow("myCanvas");
            }
        });
    },
    // 13.2、绘制事件
    /**
     * @param {str} canvasApiUrl 后台申请小程序码接口API
     * @param {str} wxPath 进入小程序的页面,后可传参（视后台接口情况而定）
     * @param {str} canvasId dom属性canvas-id值
     */
    drow(canvasApiUrl, wxPath, canvasId) {
        let that = this,
            server_url = app.globalData.server_url, //全局服务器地址
            ctx = wx.createCanvasContext(canvasId); //wxml里的canvas标签，这个的myCanvas要和标签里的canvas-id一致
        //绘制码的背景（白色）
        ctx.setFillStyle("white");
        ctx.beginPath();
        ctx.fillRect(0, 0, 190, 160); //码的背景宽高
        ctx.closePath();
        ctx.draw();
        //下载小程序码（通常为png格式，背景透明）
        wx.downloadFile({
            url: `${server_url}${canvasApiUrl}?path=${escape(wxPath)}`,
            header: {
                sessionid: wx.getStorageSync("sessionid")
            },
            success(res) {
                let wxCode = res.tempFilePath;
                //小程序码绘制
                ctx.drawImage(wxCode, 20, 0, 150, 150);
                ctx.restore();
                ctx.draw(true, () => {
                    //要延迟100毫秒绘画完成
                    wx.canvasToTempFilePath({
                        x: 0,
                        y: 0,
                        width: 190,
                        height: 160,
                        destWidth: 190,
                        destHeight: 160,
                        canvasId: canvasId,
                        success(res) {
                            //可用于展示的图片路径res.tempFilePath;
                            //绘制完成后的操作
                            wx.hideLoading();
                        }
                    });
                });
            }
        });
    },
    // 13.3、保存图片到相册
    /**
     *
     * @param {*} imgUrl 保存图片的网络路径
     */
    saveImageToPhoto(imgUrl) {
        let that = this;
        wx.saveImageToPhotosAlbum({
            filePath: imgUrl,
            success() {
                wx.showModal({
                    title: "保存图片成功",
                    content: "",
                    showCancel: false
                });
            },
            fail(res) {
                if (res.errMsg == "saveImageToPhotosAlbum:fail cancel") {
                    wx.showModal({
                        title: "保存图片失败",
                        content: "您已取消保存图片到相册！",
                        showCancel: false
                    });
                } else {
                    wx.showModal({
                        title: "提示",
                        content:
                            "保存失败，您可以点击确定设置相册权限后再尝试保存！",
                        complete(res) {
                            if (res.confirm) {
                                wx.openSetting({}); //打开小程序设置页面，可以设置权限
                            } else {
                                wx.showModal({
                                    title: "保存图片失败",
                                    content: "您已取消保存图片到相册！",
                                    showCancel: false
                                });
                            }
                        }
                    });
                }
            },
            complete() {}
        });
    }
};
